#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


int ticket = 2000;
pthread_mutex_t lock;

void *STicket(void *asg)
{
    while (1)
    {
        // 在执行临界区的代码前，先申请锁（加锁）
        pthread_mutex_lock(&lock);
        if (ticket > 0)
        {
            usleep(100);
            printf("%s sang ticket:%d \n", (char *)asg, ticket--);
        }
        else
        {
            // 当没有票的时候，也释放锁（解锁）
            pthread_mutex_unlock(&lock);
            break;
        }
        // 访问完了临界资源时，释放锁（解锁）
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main()
{
    // 动态的初始化锁
    pthread_mutex_init(&lock, NULL);
    pthread_t t[4];
    int i;
    for (i = 0; i < 4; i++)
    {
        char *p = (char *)malloc(sizeof(char) * 64);
        sprintf(p, "pthread t%d", i);
        pthread_create(&t[i], NULL, STicket, (void *)p);
    }
    pthread_join(t[0], NULL);
    pthread_join(t[1], NULL);
    pthread_join(t[2], NULL);
    pthread_join(t[3], NULL);
    // 最后销毁锁
    pthread_mutex_destroy(&lock);
    return 0;
}

// int main()
// {
//     int a = 5;
//     a--;
//     return 0;
// }

// int ticket = 2000;
// void *STicket(void *asg)
// {
//     while (1)
//     {
//         if (ticket > 0)
//         {
//             usleep(100);
//             printf("%s sang ticket:%d \n", (char *)asg, ticket--);
//         }
//         else
//         {
//             break;
//         }
//     }
//     return NULL;
// }

// int main()
// {
//     pthread_t t[4];
//     int i;
//     for (i = 0; i < 4; i++)
//     {
//         char *p = (char *)malloc(sizeof(char) * 64);
//         sprintf(p, "pthread t%d", i);
//         pthread_create(&t[i], NULL, STicket, (void *)p);
//     }
//     pthread_join(t[0], NULL);
//     pthread_join(t[1], NULL);
//     pthread_join(t[2], NULL);
//     pthread_join(t[3], NULL);

//     return 0;
// }